package org.swim.entity;

import java.io.Serializable;
import java.util.List;
import javax.persistence.*;

import org.hibernate.annotations.OnDelete;
import org.hibernate.annotations.OnDeleteAction;
import org.swim.entity.Notificabile.AzioniNotifica;
import org.swim.entity.Notificabile.TipoNotifica;

import java.util.Date;

/**
 * Entity che rappresenta un utente di SWIMv2
 * @author Giugni - Le Preux 
 */
@Entity
@NamedQueries({
	@NamedQuery(
		name="Amcizia.getAmiciziaById",
		query="SELECT a FROM Amicizia a WHERE a.id = :id")
})
@Table(name="amicizia")
public class Amicizia implements Notificabile, Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = -2538785557857329520L;
	
	public Amicizia(Utente mit, Utente dest){
		//this.idNotifica = (int) System.currentTimeMillis();
		this.mittente = mit;
		this.destinatario = dest;
		this.status = Status.INATTESA;
		this.dataModifica =  new Date(System.currentTimeMillis());
	}
	public Amicizia(){}
	//Definizione colonne
	
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name="id",nullable=false)
	private int id;
	
	@Column(name="dataModifica",nullable=true)
	private Date dataModifica;
	
	@Enumerated(EnumType.ORDINAL)
	@Column(name="status",nullable=true)
	private Status status;
	
	//Definizione relazioni
	//Amicizia -> Utente (mittente)
	
	@ManyToOne
	//@OnDelete(action=OnDeleteAction.CASCADE)
	@JoinColumn(name="emailMit", referencedColumnName="email")
	private Utente mittente;
	public Utente getMittente(){
		return mittente;
	}
	public void setMittente(Utente ut){
		this.mittente=ut;
	}

	//Amicizia -> Utente (destinatario)
	//(cascade = CascadeType.ALL)
	@ManyToOne
	//@OnDelete(action=OnDeleteAction.CASCADE)
	@JoinColumn(name="emailDest", referencedColumnName="email")
	private Utente destinatario;
	public Utente getDestinatario(){
		return destinatario;
	}
	public void setDestinatario(Utente ut){
		this.destinatario=ut;
	}

	public int getId() {
		return id;
	}
	public void setId(int id){
		this.id=id;
	}

	
	public Date getDataModifica() {
		return dataModifica;
	}
	public void setDataModifica(Date data) {
		this.dataModifica=data;
	}
	
	public Status getStatus() {
		return status;
	}
	public void setStatus(Status status) {
		this.status = status;
	}
	
	public String getIdNotifica() {
		return TipoNotifica.RICHIESTA_AMICIZIA+"@"+this.id;
	}
	
	@Override
	public Boolean hasAzione(Utente u, AzioniNotifica a) {
		switch(a){
		case ACCETTA_RIFIUTA:
			return (status == status.INATTESA && u.getEmail().equals(this.destinatario.getEmail()));
		}
		return false;
	}
	@Override
	public String getDecrizioneNotifica(Utente u) {
		// TODO Auto-generated method stub
		switch(status){
		case ACCETTATA:
			return "Tu e " + this.destinatario.getNome() + " ("+ this.destinatario.getEmail() 
					+ ") siete amici.";
		case INATTESA:
			return this.mittente.getNome() + " " + this.mittente.getCognome() 
				+ " ("+ this.mittente.getEmail() + ") vuole stringere amicizia con te.";
		}
		return "";
	}
	@Override
	public String getTitoloNotifica(Utente u) {
		switch(status){
		case ACCETTATA:
			return "Una nuova amicizia!";
		case INATTESA:
			return "Richiesta di amicizia";
		}
		return "";
	}
	@Override
	public TipoNotifica getTipo() {
		return TipoNotifica.RICHIESTA_AMICIZIA;
	}
}
